/*滑雪*/
#include <iostream>
#include <cmath>
#define maxn 101
using namespace std;

int m,n;
int loc[maxn][maxn];    //存放各点高度的数组
int dp[maxn][maxn]={0};     //存放从[i,j]点出来能到达的max距离
int next_val[4][4]={{0,1},{0,-1},{-1,0},{1,0}}; //控制上下左右

int dfs(int x,int y){   //计算从[x,y]点出发，能到达的最远距离
    int tx,ty;
    if(dp[x][y]>0)  //已经计算过了，返回即可
        return dp[x][y];
    dp[x][y]=1; //如果不能走了，默认这个点为1，后续走到该点时加一即可
    for(int i=0;i<4;i++){   //遍历上下左右四个方向
        tx=x+next_val[i][0];
        ty=y+next_val[i][1];
        if(tx<0||tx>=m||ty<0||ty>=n){   //不符合要求，忽略这个方向
            continue;
        }
        if(loc[x][y]>loc[tx][ty]){  //如果出发点比下一个点高，更新距离
            dp[x][y]=max(dp[x][y],dfs(tx,ty)+1);
        }
    }
    return dp[x][y];
}

int main(void){
    int res=0;
    cin>>m>>n;
    for(int i=0;i<m;i++){   //读入高度数组
        for(int j=0;j<n;j++){
            cin>>loc[i][j];
        }
    }
    for(int i=0;i<m;i++){   //对每个点遍历
        for(int j=0;j<n;j++){
            res=max(res,dfs(i,j));  //更新最长距离
        }
    }
    cout<<res;
    return 0;
}